/*
 *  Copyright 2013 Utkin Dmitry
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

#ifndef PROTOQTRPC_LOCATION_LOCATIONRPCSERVER_H
#define PROTOQTRPC_LOCATION_LOCATIONRPCSERVER_H

#include <QHostAddress>
#include <protoqtrpc/SocketRpcServer.h>

namespace protoqtrpc {
namespace location {

class LocationServiceClient;

class LocationRpcServer: public SocketRpcServer
{
public:
    /**
     * @brief Constructs SocketRpcServer on given port
     * @param serverName Name of this server
     * @param serverDescription Description of this server
     * @param locationServiceHost Host on which LocationService is started
     * @param locationServicePort Port on which LocationService is started
     */
    LocationRpcServer(const QString& serverName,
                      const QString& serverDescription = "",
                      const QHostAddress& locationServiceHost = QHostAddress::LocalHost,
                      quint16 locationServicePort = 0);

    /**
     * @brief Destroys SocketRpcServer
     */
    virtual ~LocationRpcServer();

    /**
     * @brief Registers the service and add it into services list
     * @param service Service to register
     * @return true if servuce was sucessfully registered
     */
    virtual bool registerService(::google::protobuf::Service* service);

    /**
     * @brief Try to start server and register this server in LocationService,
     *  if server is not started check the errorString()
     * @return true if server was started successfully
     * @sa errorString()
     */
    virtual bool start();

    /**
     * @brief Stops and deregisters this server in LocationService
     */
    virtual void stop();

private:
    using SocketRpcServer::setPort;

private:
    QString mServerName;
    QString mServerDescription;
    LocationServiceClient* mClient;
    bool mStarted;
};

}
}

#endif // PROTOQTRPC_LOCATION_LOCATIONRPCSERVER_H
